//协议分层
//1.为啥要分层
//   网络协议比较复杂，如果不拆分，太复杂
//2.分层有什么好处
//   a)拆分成多个层相当于拆分成多个模块，同时降低了整个系统的耦合程度
//   b)根据实际需要，随时都可以替换其中某一层的协议
//
//网络层和传输层都是由操作系统内核来实现的，内核提供一组系统调用，供程序员使用
//
//程序员写的所谓网络程序其实就是在调用这些内核提供的传输层系统调用（socket api）来完成应用程序
//
//TCP----传输层  HTTP-----应用层
//
//上下层协议之间交互数据
//1.封装
//2.分用
//
//可靠传输 vs 不可靠传输
//可靠传输并不是100%就能发送成功，
//知道自己发送成功还是失败
//不可靠传输不知道自己发送还是失败
//网络字节序------大端
//主机字节序------不确定  和CPU相关
//socket编程接口i（tcp/udp 客户端/服务端）
//socket本质上是一个文件描述符
//创建socket本质上就是打开一个文件（在网卡上）
//读文件就是在网卡上读数据，写文件就是往网卡写数据
// -普通文件 d目录文件 p管道文件 l链接文件 s socket文件
// 文件描述符是一个数组下标，文件描述符表下标
// socket用完之后也要及时关闭，
// socket是创建一个socket文件
// bind把一个socket文件和一个端口号关联在一起（TCP/UDP）
//  一个进程可以关联多个端口号，一个端口号只能找到一个进程
//listen（服务器来使用）tcp
//主动一方叫客户端 被动一方叫服务端
//进入监听状态。
//accept（服务器来使用）tcp
//接受连接
//connect（客户端来使用）TCP
//发起连接请求
//发送/接收
//read/write（TCP，不能针对UDP的socket）
//recv/send（TCP/功能更丰富）
//recvfrom/sendto（UDP）
